home *** CD-ROM | disk | FTP | other *** search
Text File | 1991-05-01 | 47.4 KB | 1,800 lines | [TEXT/MPS ] |
- // UControl.cp
- // Copyright © 1987-1991 by Apple Computer Inc. All rights reserved.
-
- #ifndef __UCONTROL__
- #include "UControl.h"
- #endif
-
- #ifndef __STDLIB__
- #include "StdLib.h"
- #endif
-
- #ifndef __USCROLLER__
- #include <UScroller.h>
- #endif
-
- #ifndef __UMACAPPUTILITIES__
- #include <UMacAppUtilities.h>
- #endif
-
- #ifndef __UMACAPPGLOBALS__
- #include <UMacAppGlobals.h>
- #endif
-
- #ifndef __UADORNERS__
- #include <UAdorners.h>
- #endif
-
- #ifndef __UITERATOR__
- #include <UIterator.h>
- #endif
-
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAControlRes
-
- pascal void ActionProcForTScrollBar(ControlHandle aCMgrControl,
- short partCode)
- {
- TScrollBar * aScrollBar;
-
- aScrollBar = (TScrollBar *)(GetCRefCon(aCMgrControl));
- FailNIL(aScrollBar); // What else you gonna' do?
-
- aScrollBar->ActionProc(partCode);
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MASelCommand
- pascal void TControlTracker::Initialize(void) // override
- {
- inherited::Initialize();
-
- fControl = NULL;
- fTrackNonMovement = TRUE;
- fViewConstrain = FALSE;
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MASelCommand
-
- pascal void TControlTracker::IControlTracker(TControl* theControl,
- const VPoint& itsMouse)
- {
- this->INoChangesTracker(cTrackingControl, NULL, theControl, theControl->GetScroller(TRUE), itsMouse);
- #if qDebug
- if (theControl == NULL)
- ProgramBreak("Control passed to IControlTracker can''t be NULL.");
- #endif
-
- fControl = theControl;
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAFields
-
- pascal void TControlTracker::Fields(TObject* obj)// override
- {
- obj->DoToField("TControlTracker", NULL, bClass);
- obj->DoToField("fControl", &fControl, bObject);
-
- inherited::Fields(obj);
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAOpen
-
- pascal void TControl::Initialize(void) // override
- {
- inherited::Initialize();
-
- fTextStyle = gSystemStyle;
- fDefChoice = mOKHit; // ??? Is this the best default
- fHilite = FALSE;
- fDimmed = FALSE;
- fSizeable = TRUE;
- fAdornment = 0;
- fPenSize = Point(0x0001, 0x0001); // ??? Should there be a gStdPenSize
- fInset = gZeroVRect;
- fDismissesDialog = FALSE;
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAOpen
-
- pascal void TControl::IControl(TView* itsSuperView,
- const VPoint& itsLocation,
- const VPoint& itsSize,
- SizeDeterminer itsHSizeDet,
- SizeDeterminer itsVSizeDet)
- {
- TDocument * itsDocument;
-
-
- #if qDebug
- if ((itsSize.h > kMaxCoord) || (itsSize.v > kMaxCoord))
- {
- Str255 theString;
- ConcatNumber("The size in pixels of a TControl cannot exceed ", kMaxCoord, theString);
- ProgramBreak(theString);
- }
- #endif
-
- // !!! Really need to have itsDocument come in through the parameter list (post 2.0)
- // Make best guess for now.
- if (itsSuperView != NULL)
- itsDocument = itsSuperView->fDocument;
- else
- itsDocument = NULL;
-
- this->IView(itsDocument, itsSuperView, itsLocation, itsSize, itsHSizeDet, itsVSizeDet);
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAOpen
-
- pascal void TControl::IRes(TDocument* itsDocument,
- TView* itsSuperView,
- Ptr& itsParams)
- {
- TextStyle aTextStyle;
- Rect r;
-
- inherited::IRes(itsDocument, itsSuperView, itsParams);
-
- ControlTemplate& templateData = *((ControlTemplate *) itsParams);
-
- /* fDefChoice = mOKHit; */ //??? This seems questionable
- fPenSize = templateData.itsPenSize;
- this->SetAdornment(templateData.itsAdornment, kDontRedraw);
- fSizeable = templateData.isSizable;
- this->HiliteState(templateData.isHilited, kDontRedraw);
- this->DimState(templateData.isDimmed, kDontRedraw);
- fDismissesDialog = templateData.canDismiss;
- r = templateData.itsInset;
- fInset = r;
- SetTextStyle(aTextStyle, GetFontNum(templateData.itsFontName), templateData.itsTextFace, templateData.itsTextSize, templateData.itsTextColor);
- fTextStyle = aTextStyle;
-
- OffsetPtrWStr(itsParams, sizeof(ControlTemplate));
-
- #if qDebug
- // Any good reason besides TControl???
- if ((fSize.h > kMaxCoord) || (fSize.v > kMaxCoord))
- {
- Str255 theString;
- ConcatNumber("The size in pixels of a TControl cannot exceed ", kMaxCoord, theString);
- ProgramBreak(theString);
- }
- #endif
-
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAControlRes
-
- pascal TObject* TControl::Clone(void) // override
- {
- TControl * aClonedControl;
-
- aClonedControl = (TControl *)(inherited::Clone());
-
- return aClonedControl;
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAWriteRes
-
- pascal void TControl::WRes(ViewRsrcHandle theResource,
- Ptr& itsParams) // override
- {
- short theSize;
- Str255 theFont;
- Rect r;
-
- inherited::WRes(theResource, itsParams);
-
- theSize = fTextStyle.tsSize;
- GetPortFontInfo(fTextStyle.tsFont, theFont, theSize);
-
- ControlTemplate& templateData = *((ControlTemplate *) ExpandPtrWStr((Handle)theResource, itsParams, sizeof(ControlTemplate), theFont.Length()));
-
- templateData.itsAdornment = fAdornment;
- templateData.itsPenSize = fPenSize;
- templateData.isSizable = fSizeable;
- templateData.isDimmed = fDimmed;
- templateData.isHilited = fHilite;
- templateData.canDismiss = fDismissesDialog;
- r = fInset;
- templateData.itsInset = r;
- templateData.itsTextFace = fTextStyle.tsFace;
- templateData.itsTextSize = theSize;
- templateData.itsTextColor = fTextStyle.tsColor;
- // itsFontName = theFont;
- CopyStr255(theFont, PRStr(templateData.itsFontName));
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAWriteRes
-
- pascal void TControl::WriteRes(ViewRsrcHandle theResource,
- Ptr& itsParams) // override
- {
- gWResSignature = 'cntl';
- gWResType = "TControl";
- this->WRes(theResource, itsParams);
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAControlRes
-
- pascal void TControl::ComputeSize(VPoint& newSize)// override
- {
- inherited::ComputeSize(newSize);
- if (!fSizeable)
- {
- // …we need to adjust the bot/right offset
- // If view is going to change size, then doesn't change control's actual size
- fInset[botRight] += newSize - fSize;
- }
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAControlRes
-
- pascal Boolean TControl::ContainsMouse(const VPoint& theMouse)// override
- {
- VRect aRect;
-
- this->ControlArea(aRect);
- return aRect.Contains(theMouse);
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAControlRes
-
- pascal void TControl::ControlArea(VRect& theArea)
- {
- theArea = VRect(fInset[topLeft], fSize - fInset[botRight]);
- if (IN(fAdornment, adnShadow))
- theArea[botRight] -= VPoint(fPenSize);
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAControlRes
-
- pascal void TControl::Dim(void)
- {
- VRect area;
- Rect qdArea;
-
- #if qDebug
- this->AssumeFocused();
- #endif
- this->ControlArea(area);
- this->ViewToQDRect(area, qdArea);
- PenPat(qd.gray);
- PenMode(patBic);
- PaintRect(qdArea);
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MANonRes
-
- pascal void TControl::DimState(Boolean state,
- Boolean redraw)
- {
- if (state != fDimmed)
- {
- fDimmed = state;
- if (state) // dim adorner draws the dim state
- this->AddAdorner(gDimAdorner, kLowestAdornPriority - 10, kDontRedraw);
- else
- this->DeleteAdorner(gDimAdorner, kDontRedraw);
- if (redraw)
- this->DrawContents(); // Draw change immediately
- }
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MASelCommand
-
- pascal void TControl::DoMouseCommand(VPoint& theMouse,
- TToolboxEvent* ,
- Point) // override
- {
- TControlTracker * aControlTracker;
-
- aControlTracker = new TControlTracker;
- aControlTracker->IControlTracker(this, theMouse);
- this->PostCommand(aControlTracker);
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment DlgRes
-
- pascal void TControl::Flash(void)
- {
- long dontCare;
-
- this->HiliteState(TRUE, kRedraw);
- Delay(8, dontCare);
- this->HiliteState(FALSE, kRedraw);
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAControlRes
-
- pascal Boolean TControl::Focus(void) // override
- {
- TextStyle aTextStyle;
-
- if (inherited::Focus())
- {
- aTextStyle = fTextStyle;
- SetPortTextStyle(aTextStyle);
- PenNormal();
- return TRUE;
- }
- else
- return FALSE;
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAControlRes
-
- pascal void TControl::Hilite(void)
- {
- VRect area;
- Rect qdArea;
-
- #if qDebug
- this->AssumeFocused();
- #endif
- this->ControlArea(area);
- this->ViewToQDRect(area, qdArea);
- InvertRect(qdArea);
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MANonRes
-
- pascal void TControl::HiliteState(Boolean state,
- Boolean redraw)
- {
- if (state != fHilite)
- {
- fHilite = state;
- if (state) // hilite adorner draws the hilite state
- this->AddAdorner(gHiliteAdorner, kLowestAdornPriority - 5, kDontRedraw);
- else
- this->DeleteAdorner(gHiliteAdorner, kDontRedraw);
- if (redraw && this->IsDrawable())
- this->Hilite();
- }
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MANonRes
-
- pascal void TControl::Inset(short dh,
- short dv,
- Boolean redraw)
- {
- if (fSizeable)
- {
- fInset += VPoint(dv, dh);
- this->Resize(fSize.Copy(), redraw);
- }
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MANonRes
-
- pascal void TControl::InstallColor(const RGBColor& theColor,
- Boolean redraw)
- {
- fTextStyle.tsColor = theColor;
- if (redraw)
- this->DrawContents();
- }
-
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MANonRes
-
- pascal void TControl::InstallTextStyle(const TextStyle& theTextStyle,
- Boolean redraw)
- {
- fTextStyle = theTextStyle;
- if (redraw)
- this->DrawContents();
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAControlRes
-
- pascal Boolean TControl::IsDimmed(void)
- {
- return fDimmed;
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MANonRes
-
- pascal void TControl::Resize(const VPoint& newSize,
- Boolean invalidate)// override
- {
- // If we need to invalidate, then invalidate the whole view rather than
- // the difference between the old and new size.
- inherited::Resize(newSize, invalidate);
-
- if (invalidate)
- this->ForceRedraw();
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAControlRes
-
- pascal void TControl::GetAdornExtent(VRect& itsAdornExtent)// override
- {
- // NOTE: for compatibility with MacApp 2.0, this doesn't inset the extent by fInset
-
- this->GetExtent(itsAdornExtent);
-
- if (IN(fAdornment, adnShadow)) // account for shadowing
- itsAdornExtent[botRight] -= VPoint(fPenSize);
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MANonRes
-
- pascal TAdornment* TControl::MakeAdornment(void)
- {
- fViewAdornment = inherited::MakeAdornment();
- fViewAdornment->fPenSize = fPenSize;
- return fViewAdornment;
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MANonRes
-
- pascal void TControl::SetAdornment(/* CntlAdornment */ short newAdornment,
- Boolean redraw)
- {
- if (fAdornment != newAdornment)
- {
- fAdornment = newAdornment;
-
- // parse newAdornment adding adorners as needed
- if ((newAdornment & kFrame) == kFrame) // kFrame
- {
- this->DeleteAdornerByID(kLineTopAdorner, redraw);
- this->DeleteAdornerByID(kLineLeftAdorner, redraw);
- this->DeleteAdornerByID(kLineBottomAdorner, redraw);
- this->DeleteAdornerByID(kLineRightAdorner, redraw);
- this->AddAdorner( NewStdAdorner(kFrameAdorner,"",kFrameAdorner,kFreeOnDeletion),
- kLowestAdornPriority - 15, redraw);
- }
- else
- {
- this->DeleteAdornerByID(kFrameAdorner, redraw);
- if (IN(newAdornment, adnLineTop))// adnLineTop
- this->AddAdorner( NewStdAdorner(kLineTopAdorner,"",kLineTopAdorner,kFreeOnDeletion),
- kLowestAdornPriority - 15, redraw);
- else
- this->DeleteAdornerByID(kLineTopAdorner, redraw);
- if (IN(newAdornment, adnLineLeft))// adnLineLeft
- this->AddAdorner( NewStdAdorner(kLineLeftAdorner,"", kLineLeftAdorner, kFreeOnDeletion),
- kLowestAdornPriority - 15, redraw);
- else
- this->DeleteAdornerByID(kLineLeftAdorner, redraw);
- if (IN(newAdornment, adnLineBottom))// adnLineBottom
- this->AddAdorner( NewStdAdorner(kLineBottomAdorner,"", kLineBottomAdorner, kFreeOnDeletion),
- kLowestAdornPriority - 15, redraw);
- else
- this->DeleteAdornerByID(kLineBottomAdorner, redraw);
- if (IN(newAdornment, adnLineRight))// adnLineRight
- this->AddAdorner( NewStdAdorner(kLineRightAdorner,"", kLineRightAdorner, kFreeOnDeletion),
- kLowestAdornPriority - 15, redraw);
- else
- this->DeleteAdornerByID(kLineRightAdorner, redraw);
- }
-
-
- if (IN(newAdornment, adnOval))// adnOval
- this->AddAdorner( NewStdAdorner(kOvalAdorner, "", kOvalAdorner, kFreeOnDeletion),
- kLowestAdornPriority - 20, redraw);
- else
- this->DeleteAdornerByID(kOvalAdorner, redraw);
-
- if (IN(newAdornment, adnRRect))// adnRRect
- this->AddAdorner( NewStdAdorner(kRRectAdorner, "", kRRectAdorner, kFreeOnDeletion),
- kLowestAdornPriority - 20, redraw);
- else
- this->DeleteAdornerByID(kRRectAdorner, redraw);
-
- fViewAdornment = this->MakeAdornment(); // Make sure we have one
- if (IN(newAdornment, adnShadow))// adnShadow
- fViewAdornment->fDrawShadow = TRUE;
- else
- fViewAdornment->fDrawShadow = FALSE;
-
- if (redraw)
- this->ForceRedraw();
- }
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MANonRes
-
- pascal void TControl::SetInset(const VRect& newInset,
- Boolean redraw)
- {
- if (fSizeable)
- {
- fInset = newInset;
- this->Resize(fSize.Copy(), redraw);
- }
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MASelCommand
-
- pascal void TControl::TrackFeedback(TrackPhase aTrackPhase,
- const VPoint& anchorPoint,
- const VPoint& previousPoint,
- const VPoint& nextPoint,
- Boolean mouseDidMove,
- Boolean turnItOn)
-
- {
- // do nothing
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MASelCommand
-
- pascal void TControl::TrackMouse(TrackPhase aTrackPhase,
- VPoint&, // anchorPoint
- VPoint&, // previousPoint
- VPoint& nextPoint,
- Boolean) // mouseDidMove
- {
- switch (aTrackPhase)
- {
- case trackBegin:
- this->HiliteState(TRUE, kRedraw);
- break;
- case trackContinue:
- this->HiliteState(this->ContainsMouse(nextPoint), kRedraw);
- break;
- case trackEnd:
- if (fHilite)
- this->HiliteState(FALSE, kRedraw);
- if (this->ContainsMouse(nextPoint))
- this->HandleEvent(fDefChoice, this, NULL);
- break;
- }
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAControlRes
-
- pascal long TControl::Validate(void)
- {
- return noErr;
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAFields
-
- pascal void TControl::Fields(TObject* obj) // override
- {
- obj->DoToField("TControl", NULL, bClass);
- obj->DoToField("fDefChoice", &fDefChoice, bInteger);
- obj->DoToField("fHilite", &fHilite, bBoolean);
- obj->DoToField("fDimmed", &fDimmed, bBoolean);
- obj->DoToField("fSizeable", &fSizeable, bBoolean);
- obj->DoToField("fDismissesDialog", &fDismissesDialog, bBoolean);
- obj->DoToField("fAdornment", &fAdornment, bCntlAdornment);
- obj->DoToField("fPenSize", &fPenSize, bPoint);
- obj->DoToField("fInset", &fInset, bRect);
- obj->DoToField("fTextStyle", &fTextStyle, bTextStyle);
-
- inherited::Fields(obj);
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAOpen
-
- pascal void TCtlMgr::Initialize(void) // override
- {
- inherited::Initialize();
- fCMgrControl = NULL;
-
- // These MUST be initialized because SetLongValues tests each new value against
- // the old value before doing anything. If the fLongMax value should happen to
- // have a (bogus - uninitialized) value that matches itsMax, fBitsToShift won't
- // be initialized and the control manager control will behave erratically.
- fBitsToShift = 0;
- fLongVal = 0;
- fLongMin = 0;
- fLongMax = 0;
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAOpen
-
- pascal void TCtlMgr::ICtlMgr(TView* itsSuperView,
- const VPoint& itsLocation,
- const VPoint& itsSize,
- SizeDeterminer itsHSizeDet,
- SizeDeterminer itsVSizeDet,
- const Str255& itsTitle,
- long itsVal,
- long itsMin,
- long itsMax,
- short itsProcID)
- {
- VRect itsBounds;
-
- this->IControl(itsSuperView, itsLocation, itsSize, itsHSizeDet, itsVSizeDet);
- this->ControlArea(itsBounds);
- this->CreateCMgrControl(itsBounds, itsTitle, itsVal, itsMin, itsMax, itsProcID);
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAOpen
-
- pascal void TCtlMgr::IRes(TDocument* itsDocument,
- TView* itsSuperView,
- Ptr& itsParams)
- {
- inherited::IRes(itsDocument, itsSuperView, itsParams);
- //The subclass must create the Control Manager control
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAControlRes
-
- pascal TObject* TCtlMgr::Clone(void) // override
- {
- TCtlMgr * aClonedCtlMgr;
- short itsProcID;
- VRect contrlVRect;
-
- aClonedCtlMgr = (TCtlMgr *)(inherited::Clone());
-
- if (aClonedCtlMgr->fCMgrControl != NULL)
- {
- itsProcID = GetCVariant(aClonedCtlMgr->fCMgrControl);
-
- ControlRecord & recordData = **(aClonedCtlMgr->fCMgrControl);
-
- contrlVRect = recordData.contrlRect;
- aClonedCtlMgr->CreateCMgrControl(contrlVRect, recordData.contrlTitle, recordData.contrlValue, recordData.contrlMin, recordData.contrlMax, itsProcID);
- }
-
- return aClonedCtlMgr;
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAWriteRes
-
- pascal void TCtlMgr::WriteRes(ViewRsrcHandle theResource,
- Ptr& itsParams) // override
- {
- // We don't write TCtlMgrs…
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAClose
-
- pascal void TCtlMgr::Free(void) // override
- {
- if (fCMgrControl)
- {
- this->SetCMgrVisibility(FALSE); // This insures that HideControl, which will
- // be called by SizeControl, doesn't do
- // anything. HideControl seems to have some
- // problems with large (~> 14000x14000)
- SizeControl(fCMgrControl, 0, 0); // Prevent CMgr from erasing the control!
- DisposeControl(fCMgrControl);
- fCMgrControl = NULL; // So BeInPort and others will be happy!
- }
- inherited::Free();
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MANonRes
-
- pascal void TCtlMgr::BeInPort(GrafPtr itsPort) // override
- {
- if (fCMgrControl)
- {
- ControlRecord & recordData = **fCMgrControl;
- if (!itsPort)
- {
- this->SetCMgrVisibility(FALSE);
- recordData.contrlOwner = (WindowPtr)gWorkPort;
- }
- else
- {
- this->SetCMgrVisibility(TRUE);
- recordData.contrlOwner = (WindowPtr)itsPort;
- }
- }
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAOpen
-
- pascal void TCtlMgr::CreateCMgrControl(const VRect& itsBounds,
- const Str255& itsTitle,
- long itsVal,
- long itsMin,
- long itsMax,
- short itsProcID)
- {
- GrafPtr itsPort;
- ControlHandle aCMgrControl;
- FailInfo fi;
-
- itsPort = this->GetGrafPort();
- if (!itsPort)
- itsPort = gWorkPort;
- if (fi.Try())
- {
- Rect qdRect;
- this->ViewToQDRect(itsBounds, qdRect);
- aCMgrControl = NewControl(itsPort, qdRect, itsTitle, FALSE, 0, 0, 0, itsProcID, (long)this);
- FailNIL(aCMgrControl);
- fi.Success();
- }
- else // Recover
- {
- this->Free();
- fi.ReSignal();
- }
- // Keep control off Window's control list b/c the Window Mgr adds the regions of controls in
- // the control list to the update region (see NOTE under DrawControls in Inside Mac volume I)
- // generating an update event.
-
- WindowRecord& windowData = *((WindowRecord *) itsPort);
- windowData.controlList = (*(windowData.controlList))->nextControl;
-
- fCMgrControl = aCMgrControl;
- this->DimState(fDimmed, kDontRedraw);
-
- // Remember, the control was created with zeros, fix it up.
- this->SetLongValues(itsVal, itsMin, itsMax, kDontRedraw);
-
- this->SetCMgrVisibility(itsPort != gWorkPort);
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MANonRes
-
- class CCtlMgrHiliter
- {
- // Fields
- TCtlMgr* fCtlMgr;
- const Boolean& fState;
-
- public:
- // Constructor
- CCtlMgrHiliter(TCtlMgr* theCtlMgr,
- const Boolean& theState) :
- fCtlMgr(theCtlMgr),
- fState(theState)
- {
- }
-
- // Method
- pascal void SetToDim(void);
- pascal void SetToHilite(void);
- };
-
- #pragma segment MANonRes
-
- pascal void CCtlMgrHiliter::SetToDim(void)
- {
- HiliteControl(fCtlMgr->fCMgrControl, fState * 255);
- fCtlMgr->fDimmed = fState;
- }
-
- #pragma segment MANonRes
-
- pascal void CCtlMgrHiliter::SetToHilite(void)
- {
- HiliteControl(fCtlMgr->fCMgrControl, fState * 10);
- }
-
- #pragma segment MANonRes
-
- pascal void TCtlMgr::DimState(Boolean state,
- Boolean redraw) // override
- {
- CCtlMgrHiliter aCtlMgrHiliter(this, state);
-
- //!!! Temporary kludge //if (fDimmed != state)
- this->WhileFocused((DoWhileFocusedType) & CCtlMgrHiliter::SetToDim, &aCtlMgrHiliter, redraw);
- fDimmed = state;
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MASelCommand
-
- pascal void TCtlMgr::DoMouseCommand(VPoint& theMouse,
- TToolboxEvent*,
- Point) // override
- {
- Point theQDMouse(this->ViewToQDPt(theMouse));
-
- if (TestControl(fCMgrControl, theQDMouse) != 0)
- if (TrackControl(fCMgrControl, theQDMouse, (ProcPtr)(-1)) != 0)
- this->HandleEvent(fDefChoice, this, NULL);
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAControlRes
-
- pascal void TCtlMgr::Draw(const VRect& area) // override
- {
- WindowPtr savedOwner;
- VRect itsExtent;
-
- if (this->IsCMgrVisible())
- {
- // Set the port in case we're printing
- #if qDebug
- this->AssumeFocused();
- #endif
- ControlRecord& recordData = **fCMgrControl;
- savedOwner = recordData.contrlOwner;
- recordData.contrlOwner = (WindowPtr)(qd.thePort);
-
- PenNormal(); // NECESSARY???
- Draw1Control(fCMgrControl);
-
- (*fCMgrControl)->contrlOwner = savedOwner;// traps may have moved memory
- }
-
- inherited::Draw(area); // to get adornment
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAControlRes
-
- pascal Boolean TCtlMgr::IsCMgrVisible(void)
- {
- return (fCMgrControl && ((*fCMgrControl)->contrlVis == 255));
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAControlRes
-
- pascal short TCtlMgr::GetMax(void)
- {
- return GetCtlMax(fCMgrControl);
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAControlRes
-
- pascal short TCtlMgr::GetMin(void)
- {
- return GetCtlMin(fCMgrControl);
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAControlRes
-
- pascal void TCtlMgr::GetText(Str255& theText)
- {
- theText = "";
- if (fCMgrControl)
- theText = (*fCMgrControl)->contrlTitle;
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAControlRes
-
- pascal short TCtlMgr::GetVal(void)
- {
- if (fCMgrControl)
- return GetCtlValue(fCMgrControl);
- else
- return 0;
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAControlRes
-
- pascal short TCtlMgr::GetVariant(void)
- {
- if (fCMgrControl)
- return GetCVariant(fCMgrControl);
- else
- return 0;
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MANonRes
-
- pascal void TCtlMgr::HiliteState(Boolean state,
- Boolean redraw)// override
- {
- CCtlMgrHiliter aCtlMgrHiliter(this, state);
-
- if (fHilite != state)
- this->WhileFocused((DoWhileFocusedType) & CCtlMgrHiliter::SetToHilite, &aCtlMgrHiliter, redraw);
- fHilite = state;
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MANonRes
-
- class CCtlMgrResizer
- {
- // Fields
- const VPoint& fNewSize;
- TCtlMgr* fCtlMgr;
-
- public:
- // Constructor
- CCtlMgrResizer(const VPoint& theNewSize,
- TCtlMgr* theCtlMgr) :
- fNewSize(theNewSize),
- fCtlMgr(theCtlMgr)
- {
- }
-
- // Method
- pascal void Resize(void);
- };
-
- #pragma segment MANonRes
-
- pascal void CCtlMgrResizer::Resize(void)
- {
- VRect area;
- fCtlMgr->ControlArea(area);
-
- Rect qdArea;
- fCtlMgr->ViewToQDRect(area, qdArea);
-
- MoveControl(fCtlMgr->fCMgrControl, qdArea.left, qdArea.top);
-
- if (fCtlMgr->fSizeable)
- SizeControl(fCtlMgr->fCMgrControl, abs(qdArea.Length(hSel)), abs(qdArea.Length(vSel)));
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MANonRes
-
- pascal void TCtlMgr::Resize(const VPoint& newSize,
- Boolean invalidate) // override
- {
- inherited::Resize(newSize, invalidate);
-
- CCtlMgrResizer aCtlMgrResizer(newSize, this);
-
- if (fSizeable && fCMgrControl)
- this->WhileFocused((DoWhileFocusedType) & CCtlMgrResizer::Resize, &aCtlMgrResizer, kDontRedraw);
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAControlRes
-
- pascal void TCtlMgr::SetCMgrVisibility(Boolean beVisible)
- {
- if (fCMgrControl)
- if (beVisible)
- (*fCMgrControl)->contrlVis = 255;
- else
- (*fCMgrControl)->contrlVis = 0;
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAControlRes
-
- class CCtlMgrValueSetter
- {
- // Fields
- const short& fValue;
- ControlHandle& fCMgrControl;
-
- public:
- // Constructor
- CCtlMgrValueSetter(const short& theValue,
- ControlHandle& theCMgrControl) :
- fValue(theValue),
- fCMgrControl(theCMgrControl)
- {
- }
-
- // Method
- pascal void SetMin(void);
- pascal void SetMax(void);
- pascal void SetValue(void);
- };
-
- #pragma segment MAControlRes
-
- pascal void CCtlMgrValueSetter::SetMin(void)
- {
- SetCtlMin(fCMgrControl, fValue);
- }
-
- #pragma segment MAControlRes
-
- pascal void CCtlMgrValueSetter::SetMax(void)
- {
- SetCtlMax(fCMgrControl, fValue);
- }
-
- #pragma segment MAControlRes
-
- pascal void CCtlMgrValueSetter::SetValue(void)
- {
- SetCtlValue(fCMgrControl, fValue);
- }
-
- #pragma segment MAControlRes
-
- pascal void TCtlMgr::SetMax(short itsMax,
- Boolean redraw)
- {
- CCtlMgrValueSetter aCtlMgrValueSetter(itsMax, fCMgrControl);
-
- this->WhileFocused((DoWhileFocusedType) & CCtlMgrValueSetter::SetMax, &aCtlMgrValueSetter, redraw);
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAControlRes
-
- pascal void TCtlMgr::SetMin(short itsMin,
- Boolean redraw)
- {
- CCtlMgrValueSetter aCtlMgrValueSetter(itsMin, fCMgrControl);
-
- this->WhileFocused((DoWhileFocusedType) & CCtlMgrValueSetter::SetMin, &aCtlMgrValueSetter, redraw);
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MANonRes
-
- class CCtlMgrTextSetter
- {
- // Fields
- const Str255& fText;
- Str255& fCurrentText;
- Rect& fRect;
- TCtlMgr* fCtlMgr;
-
- public:
- // Constructor
- CCtlMgrTextSetter(const Str255& theText,
- Str255& theCurrentText,
- Rect& theRect,
- TCtlMgr* theCtlMgr) :
- fText(theText),
- fCurrentText(theCurrentText),
- fRect(theRect),
- fCtlMgr(theCtlMgr)
- {
- }
-
- // Method
- pascal void SetText(void);
- };
-
- #pragma segment MANonRes
-
- pascal void CCtlMgrTextSetter::SetText(void)
- {
- GetCTitle(fCtlMgr->fCMgrControl, fCurrentText);
- if (fCurrentText != fText)
- SetCTitle(fCtlMgr->fCMgrControl, fText);
- fRect = (*(fCtlMgr->fCMgrControl))->contrlRect;
- if (fCtlMgr->IsFocused())
- fCtlMgr->ValidateRect(fRect); // Because Control Manager invalidates it.
- }
-
- #pragma segment MANonRes
-
- pascal void TCtlMgr::SetText(const Str255& itsText,
- Boolean redraw)
- {
- Str255 currentText;
- Rect itsRect;
- CCtlMgrTextSetter aCtlMgrTextSetter(itsText, currentText, itsRect, this);
-
- this->WhileFocused((DoWhileFocusedType) &CCtlMgrTextSetter::SetText, &aCtlMgrTextSetter, redraw);
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAControlRes
-
- pascal void TCtlMgr::SetVal(short newVal,
- Boolean redraw)
- {
- CCtlMgrValueSetter aCtlMgrValueSetter(newVal, fCMgrControl);
-
- if (GetCtlValue(fCMgrControl) != newVal)
- this->WhileFocused((DoWhileFocusedType) & CCtlMgrValueSetter::SetValue, &aCtlMgrValueSetter, redraw);
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAControlRes
-
- class CCtlMgrAdjuster
- {
- // Fields
- const short& fValue;
- const short& fMin;
- const short& fMax;
- ControlHandle& fCMgrControl;
-
- public:
- // Constructor
- CCtlMgrAdjuster(const short& theValue,
- const short& theMin,
- const short& theMax,
- ControlHandle& theCMgrControl) :
- fValue(theValue),
- fMin(theMin),
- fMax(theMax),
- fCMgrControl(theCMgrControl)
- {
- }
-
- // Method
- pascal void SetValues(void);
- };
-
- #pragma segment MAControlRes
-
- pascal void CCtlMgrAdjuster::SetValues(void)
- {
- SetCtlMin(fCMgrControl, fMin);
- SetCtlMax(fCMgrControl, fMax);
- SetCtlValue(fCMgrControl, fValue);
- }
-
- #pragma segment MAControlRes
-
- pascal void TCtlMgr::SetValues(short itsVal,
- short itsMin,
- short itsMax,
- Boolean redraw)
- {
- CCtlMgrAdjuster aCtlMgrAdjuster(itsVal, itsMin, itsMax, fCMgrControl);
-
- this->WhileFocused((DoWhileFocusedType) & CCtlMgrAdjuster::SetValues, &aCtlMgrAdjuster, redraw);
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAControlRes
-
- pascal void TCtlMgr::WhileFocused(DoWhileFocusedType DoWhileFocused,
- void* staticLink,
- Boolean redraw)
- {
- Boolean wasVisible;
-
- if (fCMgrControl)
- {
- if (redraw && this->Focus())
- DoWhileFocused(staticLink);
- else
- {
- wasVisible = this->IsCMgrVisible();
- this->SetCMgrVisibility(FALSE);
- DoWhileFocused(staticLink);
- if (wasVisible && (!IsCMgrVisible()))// If DoWhileFocused didn't set it
- this->SetCMgrVisibility(wasVisible);// …restore visibility
- }
- }
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAControlRes
-
- pascal VCoordinate TCtlMgr::GetLongMax(void)
- {
- return fLongMax;
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAControlRes
-
- pascal VCoordinate TCtlMgr::GetLongMin(void)
- {
- return fLongMin;
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAControlRes
-
- pascal VCoordinate TCtlMgr::GetLongVal(void)
- {
- return fLongVal;
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAControlRes
-
- pascal void TCtlMgr::SetLongMax(VCoordinate itsMax,
- Boolean redraw)
- {
- if (itsMax != fLongMax)
- {
- fLongMax = itsMax;
- fBitsToShift = 0;
- while (itsMax > MAXINT)
- {
- itsMax = ((itsMax) >> 1);
- ++fBitsToShift;
- }
- this->SetMax((short)itsMax, redraw);
- }
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAControlRes
-
- pascal void TCtlMgr::SetLongMin(VCoordinate itsMin,
- Boolean redraw)
- {
- if (itsMin != fLongMin)
- {
- fLongMin = itsMin;
- this->SetMin((short)(itsMin >> fBitsToShift), redraw);
- }
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAControlRes
-
- pascal void TCtlMgr::SetLongVal(VCoordinate itsVal,
- Boolean redraw)
- {
- itsVal = Max(fLongMin, Min(itsVal, fLongMax));
- if (itsVal != fLongVal)
- {
- fLongVal = itsVal;
- this->SetVal((short)(itsVal >> fBitsToShift), redraw);
- }
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAControlRes
-
- pascal void TCtlMgr::SetLongValues(VCoordinate itsVal,
- VCoordinate itsMin,
- VCoordinate itsMax,
- Boolean redraw)
- {
- this->SetLongMax(itsMax, redraw); // Must be first to get fBitsToShift setup
- this->SetLongMin(itsMin, redraw);
- this->SetLongVal(itsVal, redraw);
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAFields
-
- pascal void TCtlMgr::Fields(TObject* obj) // override
- {
- obj->DoToField("TCtlMgr", NULL, bClass);
- obj->DoToField("fCMgrControl", &fCMgrControl, bControlHandle);
- obj->DoToField("fBitsToShift", &fBitsToShift, bInteger);
- obj->DoToField("fLongVal", &fLongVal, bLongInt);
- obj->DoToField("fLongMin", &fLongMin, bLongInt);
- obj->DoToField("fLongMax", &fLongMax, bLongInt);
-
- inherited::Fields(obj);
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAOpen
- pascal void TScrollBar::Initialize(void) // override
- {
- inherited::Initialize();
- fDirection = hSel;
- fDefChoice = mHScrollBarHit;
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAOpen
-
- pascal void TScrollBar::IScrollBar(TView* itsSuperView,
- const VPoint& itsLocation,
- const VPoint& itsSize,
- SizeDeterminer itsHSizeDet,
- SizeDeterminer itsVSizeDet,
- VHSelect itsDirection,
- long itsVal,
- long itsMin,
- long itsMax)
- {
- this->ICtlMgr(itsSuperView, itsLocation, itsSize, itsHSizeDet, itsVSizeDet, "", itsVal, itsMin, itsMax, scrollBarProc);
- fDirection = itsDirection;
-
- if (itsDirection == hSel)
- fDefChoice = mHScrollBarHit;
- else
- fDefChoice = mVScrollBarHit;
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAOpen
-
- pascal void TScrollBar::IRes(TDocument* itsDocument,
- TView* itsSuperView,
- Ptr& itsParams) // override
- {
- VRect area;
-
- inherited::IRes(itsDocument, itsSuperView, itsParams);
-
- ScrollBarTemplate& templateData = *((ScrollBarTemplate *) itsParams);
-
- this->ControlArea(area);
-
- this->CreateCMgrControl(area, "", templateData.value, templateData.minimum, templateData.maximum, scrollBarProc);
-
- if (area.Length(vSel) >= area.Length(hSel))
- {
- fDirection = vSel;
- fDefChoice = mVScrollBarHit;
- }
- else
- {
- fDirection = hSel;
- fDefChoice = mHScrollBarHit;
- }
-
- OffsetPtr(itsParams, sizeof(ScrollBarTemplate));
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAControlRes
-
- pascal TObject* TScrollBar::Clone(void) // override
- {
- TScrollBar * aClonedScrollBar;
-
- aClonedScrollBar = (TScrollBar *)(inherited::Clone());
-
- return aClonedScrollBar;
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAWriteRes
-
- pascal void TScrollBar::WRes(ViewRsrcHandle theResource,
- Ptr& itsParams) // override
- {
- inherited::WRes(theResource, itsParams);
-
- ScrollBarTemplate& templateData = *((ScrollBarTemplate *) ExpandPtr((Handle)theResource, itsParams, sizeof(ScrollBarTemplate)));
-
- templateData.value = fLongVal;
- templateData.minimum = fLongMin;
- templateData.maximum = fLongMax;
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAWriteRes
-
- pascal void TScrollBar::WriteRes(ViewRsrcHandle theResource,
- Ptr& itsParams)// override
- {
- gWResSignature = 'sbar';
- gWResType = "TScrollBar";
- this->WRes(theResource, itsParams);
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAControlRes
-
- pascal void TScrollBar::ActionProc(short partCode)
- {
- Boolean backwards;
-
- if (partCode != 0)
- {
- backwards = ((partCode == inUpButton) || (partCode == inPageUp));
-
- if ((backwards && (fLongVal > fLongMin)) || ((!backwards) && (fLongVal < fLongMax)))
- this->TrackScrollBar(partCode);
-
- this->Update(); // Make sure that we're in synch before
- // returning ??? How can this be controlable?
- this->Focus(); // make sure i am looking at myself… e.e. cummings
- }
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAScroll
-
- pascal void TScrollBar::DeltaValue(VCoordinate delta)
- {
- if (delta != 0) // Ensure that delta does not cause an overflow (or underflow)
- this->SetLongVal(fLongVal + MinMax(fLongMin - fLongVal, delta, fLongMax - fLongVal), TRUE);
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAScroll
-
- pascal void TScrollBar::DoMouseCommand(VPoint& theMouse,
- TToolboxEvent*,
- Point) // override
- {
- short partCode;
- VCoordinate oldLongValue;
- VCoordinate newLongValue;
- Point theQDMouse;
-
- #if qDebug
- this->AssumeFocused();
- #endif
-
- theQDMouse = this->ViewToQDPt(theMouse);
- oldLongValue = fLongVal;
-
- switch (TestControl(fCMgrControl, theQDMouse))
- {
- case inUpButton:
- case inDownButton:
- case inPageUp:
- case inPageDown:
- partCode = TrackControl(fCMgrControl, theQDMouse, (ProcPtr) & ActionProcForTScrollBar);
-
- // This method MUST inform its superview of the change! Thanks to GLB!
- if (fLongVal != oldLongValue)
- this->HandleEvent(fDefChoice, this, NULL);
- break;
- case inThumb:
- if (TrackControl(fCMgrControl, theQDMouse, NULL) == inThumb)
- {
- // If thumb is dragged to bottom of scroll bar then ensure that
- // the new long value is set to the maximum long value.
- // We get killed by side effects if we don't use a temporary variable here.
- // This doesn't show up in the TScrollerScrollBar class because this code is
- // overridden, but it will show up in derived classes that depend on this code
- if (this->GetVal() == this->GetMax())
- newLongValue = fLongMax;
- else
- newLongValue = ((long)GetVal() << fBitsToShift);
-
- this->SetLongVal(newLongValue, kRedraw);
-
- // This method MUST inform its superview of the change!
- if (fLongVal != oldLongValue)
- this->HandleEvent(fDefChoice, this, NULL);
- }
- break;
- }
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAControlRes
-
- pascal void TScrollBar::TrackScrollBar(short partCode)
- {
- if ((partCode == inPageUp) || (partCode == inUpButton))
- this->DeltaValue(-1);
- else
- this->DeltaValue(1);
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAFields
-
- pascal void TScrollBar::Fields(TObject* obj) // override
- {
- obj->DoToField("TScrollBar", NULL, bClass);
- obj->DoToField("fDirection", &fDirection, bVHSelect);
-
- inherited::Fields(obj);
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAOpen
- pascal void TScrollerScrollBar::Initialize(void)// override
- {
- inherited::Initialize();
-
- fScrollers = NULL;
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAOpen
-
- pascal void TScrollerScrollBar::IScrollerScrollBar(TView* itsSuperView,
- const VPoint& itsLocation,
- const VPoint& itsSize,
- SizeDeterminer itsHSizeDet,
- SizeDeterminer itsVSizeDet,
- VHSelect itsDirection,
- long itsMax,
- TScroller* itsScroller)
- {
- FailInfo fi;
-
- this->IScrollBar(itsSuperView, itsLocation, itsSize, itsHSizeDet, itsVSizeDet, itsDirection, 0, 0, itsMax);
- this->SetCMgrVisibility(this->IsActive());
-
- if (fi.Try())
- {
- fScrollers = NewList();
- #if qDebug
- fScrollers->SetEltType("TScroller");
- #endif
- this->AttachScroller(itsScroller);
- fi.Success();
- }
- else // Recover
- {
- this->Free();
- fi.ReSignal();
- }
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAOpen
-
- pascal void TScrollerScrollBar::IRes(TDocument* itsDocument,
- TView* itsSuperView,
- Ptr& itsParams)// override
- {
- FailInfo fi;
-
- inherited::IRes(itsDocument, itsSuperView, itsParams);
- this->SetCMgrVisibility(this->IsActive());
-
- if (fi.Try())
- {
- fScrollers = NewList();
- #if qDebug
- fScrollers->SetEltType("TScroller");
- #endif
- fi.Success();
- }
- else // Recover
- {
- this->Free();
- fi.ReSignal();
- }
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAControlRes
-
- pascal TObject* TScrollerScrollBar::Clone(void) // override
- {
- TScrollerScrollBar * aScrollerScrollBar;
-
- aScrollerScrollBar = (TScrollerScrollBar *)(inherited::Clone());
-
- #if qDebug
- if (aScrollerScrollBar->fScrollers->GetSize() != 1)
- ProgramBreak("###TScrollerScrollBar.Clone: Unexpected number of scrollers!");
- #endif
- aScrollerScrollBar->fScrollers->DeleteAll();
-
- return aScrollerScrollBar;
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAWriteRes
-
- pascal void TScrollerScrollBar::WriteRes(ViewRsrcHandle theResource,
- Ptr& itsParams)// override
- {
- // We never want to write TScrollerScrollBars. TScroller will create its own
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAClose
-
- pascal void TScrollerScrollBar::Free(void) // override
- {
- if (fScrollers)
- {
- CArrayIterator iter(fScrollers);
-
- for (ArrayIndex i = iter.FirstIndex(); iter.More(); i = iter.NextIndex())
- {
- TScroller* theScroller = (TScroller*)fScrollers->At(i);
-
- if (theScroller->fScrollBars[fDirection] == this)
- theScroller->HaveScrollBar(NULL, fDirection);
-
- }
- fScrollers = (TList *)(FreeIfObject(fScrollers));
- }
-
- inherited::Free();
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAActivate
-
- class CScrollBarActivator
- {
- // Fields
- TScrollerScrollBar* fScrollerScrollBar;
- Boolean fEntering;
-
- public:
- // Constructor
- CScrollBarActivator(TScrollerScrollBar* theScrollerScrollBar,
- Boolean anEntering) :
- fScrollerScrollBar(theScrollerScrollBar),
- fEntering(anEntering)
- {
- }
-
- // Method
- pascal void SetScrollBar(void);
- };
-
- #pragma segment MAActivate
-
- pascal void CScrollBarActivator::SetScrollBar(void)
- {
- Rect itsQDRect;
- VRect itsRect;
-
- if (fEntering)
- ShowControl(fScrollerScrollBar->fCMgrControl);
- else
- {
- HideControl(fScrollerScrollBar->fCMgrControl);
-
- if (fScrollerScrollBar->IsFocused())
- {
- // Get the frame drawn.
- itsQDRect = (*(fScrollerScrollBar->fCMgrControl))->contrlRect;
- fScrollerScrollBar->QDToViewRect(itsQDRect, itsRect);
- fScrollerScrollBar->Draw(itsRect);
-
- // Because Control Manager invalidates the extent of the control but we did direct
- // drawing in the unclipped area.
- fScrollerScrollBar->ValidateRgn(qd.thePort->clipRgn);
- }
- }
- }
-
- #pragma segment MAActivate
-
- pascal void TScrollerScrollBar::Activate(Boolean entering)// override
- {
- CScrollBarActivator aScrollBarActivator(this, entering);
-
- this->WhileFocused((DoWhileFocusedType) & CScrollBarActivator::SetScrollBar, &aScrollBarActivator, this->Focus());
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAOpen
-
- pascal void TScrollerScrollBar::AttachScroller(TScroller* itsScroller)
- {
- if (itsScroller)
- {
- fScrollers->Insert(itsScroller);
- itsScroller->HaveScrollBar(this, fDirection);
- }
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MANonRes
-
- pascal void TScrollerScrollBar::BeInPort(GrafPtr itsPort)// override
- {
- inherited::BeInPort(itsPort);
-
- this->SetCMgrVisibility(this->IsActive());
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAScroll
-
- pascal void TScrollerScrollBar::DoMouseCommand(VPoint& theMouse,
- TToolboxEvent* event,
- Point hysteresis)// override
- {
- long sBarDelta = 0;
- Point theQDMouse;
-
- #if qDebug
- this->AssumeFocused();
- #endif
-
- theQDMouse = this->ViewToQDPt(theMouse);
- if (TestControl(fCMgrControl, theQDMouse) == inThumb)
- {
- if (TrackControl(fCMgrControl, theQDMouse, NULL) == inThumb)
- {
- CArrayIterator iter(fScrollers);
-
- // If thumb is dragged to bottom of scroll bar then ensure that
- // the new long value is set to the maximum long value.
- if (this->GetVal() == this->GetMax())
- fLongVal = fLongMax;
- else
- fLongVal = (this->GetVal() << fBitsToShift);
-
- for (ArrayIndex i = iter.FirstIndex(); iter.More(); i = iter.NextIndex())
- {
- TScroller* theScroller = (TScroller*)fScrollers->At(i);
-
- sBarDelta += theScroller->ScrollRelative(fDirection, fLongVal);
- }
-
- if (this->Focus() && (sBarDelta != 0))
- this->SetLongVal(fLongVal + sBarDelta, kRedraw);
- }
- }
- else
- inherited::DoMouseCommand(theMouse, event, hysteresis);
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAControlRes
-
- pascal void TScrollerScrollBar::Draw(const VRect& area)// override
- {
- Rect itsRect;
-
- #if qDebug
- this->AssumeFocused();
- #endif
-
- if (!IsCMgrVisible())
- {
- PenNormal();
- itsRect = (*fCMgrControl)->contrlRect;
- FrameRect(itsRect);
- }
-
- inherited::Draw(area);
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAScroll
-
- pascal void TScrollerScrollBar::TrackScrollBar(short partCode)
- {
- long sBarDelta = 0;;
- CArrayIterator iter(fScrollers);
-
- for (ArrayIndex i = iter.FirstIndex(); iter.More(); i = iter.NextIndex())
- {
- TScroller* theScroller = (TScroller*)fScrollers->At(i);
-
- sBarDelta += theScroller->ScrollStep(fDirection, partCode);
- }
-
- if (this->Focus())
- this->DeltaValue(sBarDelta);
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAFields
-
- pascal void TScrollerScrollBar::Fields(TObject* obj)// override
- {
- obj->DoToField("TScrollerScrollBar", NULL, bClass);
- obj->DoToField("fScrollers", &fScrollers, bObject);
-
- inherited::Fields(obj);
- }
-
-
-